/*****************************************************************************
 * Qwt Examples - Copyright (C) 2002 Uwe Rathmann
 * This file may be used under the terms of the 3-clause BSD License
 *****************************************************************************/

#include "Plot.h"
#include "Editor.h"

#include <QwtPlotShapeItem>
#include <QwtPlotMagnifier>
#include <QwtPlotCanvas>
#include <QwtLegend>
#include <QwtPlotRenderer>

#include <QPen>
#include <QPainterPath>

namespace
{
class Legend : public QwtLegend
{
protected:
    virtual QWidget* createWidget(const QwtLegendData& legendData) const QWT_OVERRIDE
    {
        QWidget* w = QwtLegend::createWidget(legendData);
        if (w) {
            w->setStyleSheet("border-radius: 5px;"
                             "padding: 2px;"
                             "background: LemonChiffon;");
        }

        return w;
    }
};
}

Plot::Plot(QWidget* parent) : QwtPlot(parent)
{
    setAutoReplot(false);

    setTitle("Movable Items");

    const int margin = 5;
    setContentsMargins(margin, margin, margin, margin);

    setAutoFillBackground(true);
    setPalette(QColor("DimGray").lighter(110));

    QwtPlotCanvas* canvas = new QwtPlotCanvas();
#if 0
    // a gradient making a replot slow on X11
    canvas->setStyleSheet(
        "border: 2px solid Black;"
        "border-radius: 15px;"
        "background-color: qlineargradient( x1: 0, y1: 0, x2: 0, y2: 1,"
            "stop: 0 LemonChiffon, stop: 0.5 PaleGoldenrod, stop: 1 LemonChiffon );"
    );
#else
    canvas->setStyleSheet("border: 2px inset DimGray;"
                          "border-radius: 15px;"
                          "background: LemonChiffon;");
#endif

    setCanvas(canvas);
    insertLegend(new Legend(), QwtPlot::RightLegend);

    populate();

    updateAxes();
    for (int axis = 0; axis < QwtAxis::AxisPositions; axis++)
        setAxisAutoScale(axis, false);

    m_editor = new Editor(this);
    (void)new QwtPlotMagnifier(canvas);
}

void Plot::populate()
{
    addShape("Rectangle", ShapeFactory::Rect, "RoyalBlue", QPointF(30.0, 50.0), QSizeF(40.0, 50.0));
    addShape("Ellipse", ShapeFactory::Ellipse, "IndianRed", QPointF(80.0, 130.0), QSizeF(50.0, 40.0));
    addShape("Ring", ShapeFactory::Ring, "DarkOliveGreen", QPointF(30.0, 165.0), QSizeF(40.0, 40.0));
    addShape("Triangle", ShapeFactory::Triangle, "SandyBrown", QPointF(165.0, 165.0), QSizeF(60.0, 40.0));
    addShape("Star", ShapeFactory::Star, "DarkViolet", QPointF(165.0, 50.0), QSizeF(40.0, 50.0));
    addShape("Hexagon", ShapeFactory::Hexagon, "DarkSlateGray", QPointF(120.0, 70.0), QSizeF(50.0, 50.0));
}

void Plot::addShape(const QString& title, ShapeFactory::Shape shape, const QColor& color, const QPointF& pos, const QSizeF& size)
{
    QwtPlotShapeItem* item = new QwtPlotShapeItem(title);
    item->setItemAttribute(QwtPlotItem::Legend, true);
    item->setLegendMode(QwtPlotShapeItem::LegendShape);
    item->setLegendIconSize(QSize(20, 20));
    item->setRenderHint(QwtPlotItem::RenderAntialiased, true);
    item->setShape(ShapeFactory::path(shape, pos, size));

    QColor fillColor = color;
    fillColor.setAlpha(200);

    QPen pen(color, 3);
    pen.setJoinStyle(Qt::MiterJoin);
    item->setPen(pen);
    item->setBrush(fillColor);

    item->attach(this);
}

void Plot::exportPlot()
{
    QwtPlotRenderer renderer;
    renderer.exportTo(this, "shapes.pdf");
}

void Plot::setMode(int mode)
{
    m_editor->setMode(static_cast< Editor::Mode >(mode));
}

#include "moc_Plot.cpp"
